package cn.tedu.csmall.business.service.impl;

import cn.tedu.csmall.business.service.IBusinessService;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.order.service.IOrderService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class BusinessServiceImpl implements IBusinessService {

    // Dubbo调用Order模块实现新增订单的功能
    // 提交我们业务逻辑层方法中定义的orderAddDTO对象
    // business模块是单纯的消费者,不需要在类上编写@DubboService
    @DubboReference
    private IOrderService dubboOrderService;

    // Global:全局(全球)  Transactional:事务
    // 业务逻辑层方法上添加@GlobalTransactional这个注解
    // 相当于设置了Seata分布式事务的起点,是AT模型中的TM(事务管理器)
    // 效果是从这个方法开始,远程调用的所有方法中,对数据库的操作,设置在同一个事务中
    // 根据事务的原子性特征,这些数据库操作要么都成功,出现异常时,所有的操作都会回滚
    @GlobalTransactional
    @Override
    public void buy() {
        // 先实例化一个要新增的订单对象
        OrderAddDTO orderAddDTO=new OrderAddDTO();
        orderAddDTO.setUserId("UU100");
        orderAddDTO.setCommodityCode("PC100");
        orderAddDTO.setCount(5);
        orderAddDTO.setMoney(100);
        // 实例化好的orderAddDTO对象,微服务结构中要传到order模块中
        dubboOrderService.orderAdd(orderAddDTO);
        log.info("新增的订单信息为:{}",orderAddDTO);
    }
}








